package com.sheng.leetcode.year2022.month08.day26;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/08/26
 *
 * 6. Z 字形变换
 *
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 * 请你实现这个将字符串进行指定行数变换的函数：
 * string convert(string s, int numRows);
 *
 * 示例 1：
 * 输入：s = "PAYPALISHIRING", numRows = 3
 * 输出："PAHNAPLSIIGYIR"
 *
 * 示例 2：
 * 输入：s = "PAYPALISHIRING", numRows = 4
 * 输出："PINALSIGYAHRPI"
 * 解释：
 * P     I    N
 * A   L S  I G
 * Y A   H R
 * P     I
 *
 * 示例 3：
 * 输入：s = "A", numRows = 1
 * 输出："A"
 *
 * 提示：
 *
 * 1 <= s.length <= 1000
 * s 由英文字母（小写和大写）、',' 和 '.' 组成
 * 1 <= numRows <= 1000
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/zigzag-conversion
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode0006 {

    @Test
    public void test01() {
//        String s = "PAYPALISHIRING";
//        int numRows = 3;
//        String s = "PAYPALISHIRING";
//        int numRows = 4;
//        String s = "A";
//        int numRows = 1;
//        String s = "A";
//        int numRows = 2;
//        String s = "AB";
//        int numRows = 1;
        String s = "ABC";
        int numRows = 2;
        System.out.println(new Solution6().convert(s, numRows));
    }
}
class Solution6 {
    public String convert(String s, int numRows) {
        // 首先可以根据numRows的行数，对字符串进行分组，经过观察得出分组的规律为每2 * numRows - 2为一组，n代表一组的长度
        int n = 2 * numRows - 2;
        // 字符串的总长度
        int length = s.length();
        // 当numRows为1时，排成一列直线，直接返回原字符串即可
        if (numRows == 1) {
            return s;
        }
        StringBuilder str = new StringBuilder();
        // 代表分成几行
        for (int i = 0; i < numRows; i++) {
            // 每一行进行拼接
            for (int j = 0; j < length / numRows + 1; j++) {
                int k = j * n + i;
                if (k < length) {
                    str.append(s, k, k + 1);
                }
                if (i > 0 && n > 2 * i) {
                    if (j * n + n - i < length) {
                        str.append(s, j * n + n - i, j * n + n - i + 1);
                    }
                }
            }
        }
        return str.toString();
    }
}
